'''所有线程类的基类.当然这个线程是指自制的线程.

自制线程的特点,就是任何时刻都有一个状态{}供外部查询,这样才能
保证在网页端随时反馈线程进度.
自定义线程状态{}规则为{'code':整数表示的线程状态,
 'result':顺利完成任务时的信息, 'error': 因错误结束的信息, 'status':{各种当前信息的表}}
code的规定是:
大于等于0时,表示可以开启,小于0时表示不可以开启.
0 - 从未运行过
1 - 上次运行成功结束
2 - 上次运行出错结束
-1 - 正在运行
-2 - 线程不存在所以不可开启

getStatus()方法是外部获取线程状态的方法
start(data)是开启线程的方法,data{}是线程需要的参数,开启成功返回True,
失败返回False
_threadMethod(data)是处理线程中异常与返回的方法

只有_thread(data)方法需要在使用时重写,该方法是线程的主要方法.

'''

from threading import Thread

class BaseThread:

  def __init__(self):
    self._status = {'code':0, 'result': '', 'error': '', 'status':{}}
    self._t = None # 线程,方便必要时访问运行中的线程对象,一般不用
    return
  
  def getStatus(self):
    return self._status
  
  def start(self, data):
    if (self._status['code']) < 0:
      return False
    self._status['code'] = -1
    self._status['result'] = ''
    self._status['error'] = ''
    self._status['status'] = {}
    self._t = Thread(target = self._threadMethod,args = (data,))
    self._t.start()    
    return True
    
  def _threadMethod(self, data):
    try:
      result = self._thread(data)
      self._status['code'] = 1
      self._status['result'] = result  
    except Exception as e:
      self._status['code'] = 2
      self._status['error'] = str(e)
    self._t = None
    return
  
  ## 使用时需要重写  
  def _thread(self, data):
    return 'BaseThread._thread()结束'
